﻿using System;
using System.Collections.Generic;
using System.Data;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    public class DAORamoMySql:ConexionBaseDatos,IDAORamo
    {
        /// <summary>
        /// metodo que almacena en la base de datos un tipo relacionado a un ramo
        /// </summary>
        /// <param name="miRamo"></param>
        /// <param name="miTipo"></param>
        /// <returns></returns>
        public int AgregarTipoRamo(Entidad miRamo, Entidad miTipo)
        {
            MySqlCommand comando = new MySqlCommand();
            comando.Connection = Conexion();
            comando.CommandType = CommandType.StoredProcedure;
            comando.CommandText = "AgregarTipoRamo";


            comando.Parameters.AddWithValue("@idRamo", miRamo.Id);
            comando.Parameters.AddWithValue("@idTipo", miTipo.Id);
            comando.Parameters.AddWithValue("@id", MySqlDbType.Int32);

            comando.Parameters["@idRamo"].Direction = ParameterDirection.Input;
            comando.Parameters["@idTipo"].Direction = ParameterDirection.Input;
            comando.Parameters["@id"].Direction = ParameterDirection.Output;

            comando.ExecuteNonQuery();

            int id = (int)comando.Parameters["@id"].Value;

            CerrarConexion();
            return id;
        }

        /// <summary>
        /// metodo que almacena un tipo o un ramo segun sea la necesidad
        /// </summary>
        /// <param name="miRamo"></param>
        /// <returns></returns>
        public int AgregarRamo(Ramo miRamo)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "AgregarRamo";


                comando.Parameters.AddWithValue("@tipoRamo", miRamo.Tipo);
                comando.Parameters.AddWithValue("@nombreRamo", miRamo.Nombre );

                comando.Parameters["@tipoRamo"].Direction = ParameterDirection.Input;
                comando.Parameters["@nombreRamo"].Direction = ParameterDirection.Input;

                int id = 0;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                CerrarConexion();
                return id;
            }
            catch (Exception)
            {
                return -1;
            }
        }

        /// <summary>
        /// metodo que obtiene todos los tipo de siniestro de un ramo en especifico
        /// </summary>
        /// <param name="miRamo"></param>
        /// <returns></returns>
        public List<Ramo> ObtenerTiposRamo(Entidad miRamo)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Ramo> retorno = new List<Ramo>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerTiposRamo";
                comando.Parameters.AddWithValue("@idRamo", miRamo.Id);
                comando.Parameters["@idRamo"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Ramo miTipo = FabricaEntidades.ObtenerRamo();
                    miTipo.Tipos = null;
                    miTipo.Recaudos = null;
                    miTipo.RamoTipo.Id = (int)reader[0];
                    miTipo.Id = (int) reader[1];
                    miTipo.Nombre = (string) reader[2];
                    retorno.Add(miTipo);
                }

                reader.Close();
                CerrarConexion();
                return retorno;
            }
            catch (Exception)
            {
                return  null;
            }
        }

        /// <summary>
        /// Obtiene todos los ramos almacenados
        /// </summary>
        /// <returns></returns>
        public List<Ramo> ObtenerRamos()
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Ramo> retorno = new List<Ramo>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerRamos";
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Ramo miTipo = FabricaEntidades.ObtenerRamo();
                    miTipo.Tipos = null;
                    miTipo.Recaudos = null;
                    miTipo.Id = (int)reader[0];
                    miTipo.Nombre = (string)reader[1];
                    retorno.Add(miTipo);
                }

                reader.Close();
                CerrarConexion();
                return retorno;
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// metodo que busca los datos del tipo o del ramo que coincida con el nombre
        /// </summary>
        /// <param name="nombreRamo"></param>
        /// <returns></returns>
        public Ramo ObtenerRamo(string nombreRamo)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Ramo miRamo = FabricaEntidades.ObtenerRamo();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerRamoNombre";
                comando.Parameters.AddWithValue("@nombreRamo",nombreRamo);
                comando.Parameters["@nombreRamo"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    miRamo.Tipos = null;
                    miRamo.Recaudos = null;
                    miRamo.RamoTipo = null;
                    miRamo.Id = (int)reader[0];
                    miRamo.Nombre = (string)reader[1];
                }

                reader.Close();
                CerrarConexion();
                return miRamo;
            }
            catch (Exception)
            {
                return null;
            }
        }
        /// <summary>
        /// Obtiene todos los datos del ramo dado su numero identificador
        /// </summary>
        /// <param name="idRamo"></param>
        /// <returns></returns>
        public Ramo ObtenerRamoId(int idRamo)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Ramo miRamo = FabricaEntidades.ObtenerRamo();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerRamoId";
                comando.Parameters.AddWithValue("@idRamo", idRamo);
                comando.Parameters["@idRamo"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    miRamo.Tipos = null;
                    miRamo.Recaudos = null;
                    miRamo.RamoTipo = null;
                    miRamo.Id = (int)reader[0];
                    miRamo.Nombre = (string)reader[1];
                }

                reader.Close();
                CerrarConexion();
                return miRamo;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public bool EditarRamo(Ramo miRamo)
        {
            throw new NotImplementedException();
        }

        public bool EliminarRamo(Ramo ramo)
        {
            throw new NotImplementedException();
        }
    }
}
